import json
import re
from typing import Dict, List, Any, Optional
import requests

def extract_text_from_subtitle_json(subtitle_json: str) -> str:
    """
    从字幕JSON中提取纯文本内容

    参数:
        subtitle_json (str): 字幕的JSON字符串

    返回:
        str: 提取出的纯文本内容
    """
    # 解析JSON字符串
    subtitle_data = json.loads(subtitle_json)[0]["subtitle"]
    # 不同字幕格式的处理
    text_content = ""
    for subtitle in subtitle_data:
        text_content += subtitle["content"].strip()
    return text_content

def generate_quiz_questions(text: str, question_count: Any = 4) -> Dict[str, Any]:
    """
    根据文本内容生成选择题
    
    参数:
        text (str): 课程文本内容
        question_count (Any): 已忽略，始终生成4道题
        prompt_template (str, optional): 自定义提示模板
    
    返回:
        Dict[str, Any]: 包含题目的JSON格式数据
    """
    text = extract_text_from_subtitle_json(text)
    # 使用 settings 中的配置
    from settings import QUIZ_PROMPT, DEEPSEEK_API_KEY, DEEPSEEK_BASE_URL

    # 检查 API 密钥和 URL 是否已设置
    if not DEEPSEEK_API_KEY or not DEEPSEEK_BASE_URL:
        return {"error": "API 密钥或基础 URL 未设置，请检查 settings 配置"}

    # 检查文本是否为空
    if not text or len(text.strip()) < 10:
        return {"error": "文本内容太短或为空，无法生成有意义的题目"}

    prompt = f"""
        请根据以下课程内容生成4道高质量选择题:
        \"\"\"
        {text}
        \"\"\"

        输出格式如下：
        {{
            "total_questions": 4,
            "questions": [
              {{
                "question_id": "Q1",
                "question_text": "问题内容",
                "options": {{
                  "A": "选项A",
                  "B": "选项B",
                  "C": "选项C",
                  "D": "选项D"
                }},
                "correct_answer": "正确选项字母",
                "explanation": "答案解析",
                "difficulty": "难度(easy/medium/hard)",
                "knowledge_points": ["知识点1", "知识点2"]
              }}
            ]
        }}
        只输出json，不要有任何解释性文字
        """

    # 使用与 getAIContent.py 相同的 API 调用方式
    from openai import OpenAI

    client = OpenAI(
        api_key=DEEPSEEK_API_KEY,
        base_url=DEEPSEEK_BASE_URL,
    )
    print(prompt)
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "user", "content": prompt}
        ],
        temperature=0.7,
        timeout=60  # 设置超时时间为 60 秒
    )

    result_text = response.choices[0].message.content
    return {"quizzes": json.loads(result_text)}

def generate_essay_questions(text: str, question_count: Any = 2) -> Dict[str, Any]:
    """
    根据文本内容生成主观题
    
    参数:
        text (str): 课程文本内容
        question_count (Any): 生成的主观题数量
    
    返回:
        Dict[str, Any]: 包含主观题的JSON格式数据
    """
    text = extract_text_from_subtitle_json(text)
    # 使用 settings 中的配置
    from settings import DEEPSEEK_API_KEY, DEEPSEEK_BASE_URL

    # 检查 API 密钥和 URL 是否已设置
    if not DEEPSEEK_API_KEY or not DEEPSEEK_BASE_URL:
        return {"error": "API 密钥或基础 URL 未设置，请检查 settings 配置"}

    # 检查文本是否为空
    if not text or len(text.strip()) < 10:
        return {"error": "文本内容太短或为空，无法生成有意义的题目"}

    prompt = f"""
        请根据以下课程内容生成{question_count}道高质量主观题。要求：
        1. 问题应该考察学生对知识点的深入理解和应用能力
        2. 问题应该具有开放性，鼓励学生进行思考和讨论
        3. 参考答案应该详细且具有指导性，包含关键点分析
        4. 问题难度应该合理分布，包含基础题和进阶题
        5. 知识点标注要准确且全面

        课程内容：
        \"\"\"
        {text}
        \"\"\"

        输出格式如下：
        {{
            "total_questions": {question_count},
            "questions": [
              {{
                "question_id": "E1",
                "question_text": "问题内容",
                "reference_answer": "参考答案（包含关键点分析）",
                "difficulty": "难度(easy/medium/hard)",
                "knowledge_points": ["知识点1", "知识点2"],
                "key_points": ["关键点1", "关键点2"],  # 新增：参考答案的关键点
                "suggested_time": "建议答题时间（分钟）"  # 新增：建议答题时间
              }}
            ]
        }}
        只输出json，不要有任何解释性文字
        """

    # 使用与 getAIContent.py 相同的 API 调用方式
    from openai import OpenAI

    client = OpenAI(
        api_key=DEEPSEEK_API_KEY,
        base_url=DEEPSEEK_BASE_URL,
    )
    print(prompt)
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "user", "content": prompt}
        ],
        temperature=0.7,
        timeout=180  # 设置超时时间为 180 秒
    )

    result_text = response.choices[0].message.content
    return {"essays": json.loads(result_text)}

# 示例使用
if __name__ == "__main__":
    # 测试字幕JSON提取
    sample_subtitle = """
    [
        {"from": 0, "to": 5, "content": "欢迎来到我们的课程。"},
        {"from": 5, "to": 10, "content": "今天我们将学习Python编程。"}
    ]
    """
    extracted_text = extract_text_from_subtitle_json(sample_subtitle)
    print("提取的文本:", extracted_text)
    
    # 测试生成题目
    quiz_result = generate_quiz_questions(extracted_text)
    print("生成的题目:", json.dumps(quiz_result, ensure_ascii=False, indent=2))

